package cqrtplm.mapper;

import com.alibaba.fastjson.JSONObject;
import com.ty.basic.entity.IdentifierEntity;
import com.ty.basic.entity.part.PartDO;
import com.ty.basic.entity.part.PartUsageLinkDO;
import cqrtplm.dto.PartNumberDTO;
import cqrtplm.vo.DrawingCodeVO;
import cqrtplm.vo.FeatureVO;
import cqrtplm.vo.RTCodeVO;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Repository

public interface RTPartMapper {

    List<JSONObject> queryPartIbaByList (@Param("params") List<FeatureVO> params, @Param("beginTime") Date beginTime, @Param("endDate")
                                         Date endDate);

    List<String> selectAllPartIbaByClassOid(@Param("ids") List<BigInteger> ids, @Param("keyword") String keyword);

    PartDO queryLatestPartByNumberAndView(@Param("number")String number, @Param("viewName")String viewName, @Param("state")String state);

    List<PartDO> getAllRelevancyPart(@Param("partNumber") String partNumber, @Param("types") List<String> types);

    List<JSONObject> queryPartNumberByIbaValue(@Param("ibaValue") String ibaValue);

    List<JSONObject> queryPartsByTypeAndNum(@Param("partNumber") String partNumber, @Param("type") String type);

    List<PartNumberDTO> selectAllPart(@Param("type") String type);

    List<PartDO> queryLatestPartByNumberList(@Param("list")List<String> list, @Param("state")String state);

    List<PartUsageLinkDO> queryParentPartByOid(@Param("oid") BigInteger oid);

    List<PartUsageLinkDO> batchQueryPartUsageLinkDOByPartOid(@Param("oidS") List<BigInteger> oidS);

    List<DrawingCodeVO> selectDrawingCode();

    List<RTCodeVO> queryCode(RTCodeVO postdata);

    IdentifierEntity selectClassInfoByPartOid(@Param("oid") String partOid);

    List<JSONObject> queryPartNumberByIbaAttrValue(@Param("ibaValue") String ibaValue);

    String queryImgFileOid(@Param("partId")String partId);

    /**
     * 根据零部件OID查询masteredoid和typeotype
     */
    JSONObject queryPartMasterAndTypeByOid(@Param("oid") BigInteger oid);

    /**
     * 根据图样代号的masteredoid查询衍生的物料码OID列表
     */
    List<BigInteger> queryDerivedMaterialOidsByMasterOid(@Param("masterOid") BigInteger masterOid);
    /**
     * 根据图样代号的masteredoid查询衍生的物料码最新版本OID列表
     */
    List<BigInteger> queryTheLatestItemCodeOid(@Param("masterOid") BigInteger masterOid);
    /**
     * 根据零部件OID查询零部件编号
     */
    String queryPartNumberByOid(@Param("oid") BigInteger oid);

    /**
     * 根据指定编码、视图名称、状态查询最新物料信息
     * @param number        模糊查询
     * @param viewName      视图为空 默认查询Design视图物料
     * @param state         为空不查询状态
     * @return
     */
    List<PartDO> queryLatestMaterialByViewAndViewState(@Param("number")String number, @Param("viewName")String viewName, @Param("state")String state);

    List<Map<String, Object>> queryCategoryCodeAndName();
    List<DrawingCodeVO> selectDrawingCodeByKey(List<String> keys);

    int selectPartNumberCountByFixAndType(@Param("fix") String fix, @Param("type") String type);

    int selectPartNumberCountByFixAndType2(@Param("fix") String fix, @Param("type") String type);

    //    String queryPartIdByNumber(String number);

    //    String queryPartIdByMasterNumber(String number);

    List<String> checkPartNumberIfExist(@Param("list") List<String> partNumbers);

    List<String> selectPartNumberByAttributeDefMapOid(@Param("attrDefMapOid") String attrDefMapOid);

    void partRename(@Param("masteredoid") String masteredoid, @Param("name") String name);

    List<PartDO> batchQueryLatestMaterialByViewAndViewState(@Param("list")List<String> numbers, @Param("viewName")String viewName, @Param("state")String state, @Param("type") String type);

    List<PartDO> batchQueryLatestMaterialByViewAndView(@Param("list")List<String> list, @Param("viewName")String viewName, @Param("state")String state);

    List<String> getMaxPatternCodePart(@Param("partNumber") String partNumber);

    /**
     * 查询成品码类型的物料
     * @param number
     * @return
     */
    List<JSONObject> selectEBom(@Param("number") String number, @Param("type") String type);

    List<String> queryPartNumberByLineCode(@Param("lineCode") String lineCode);

    List<String> querySimilarPartNumber(@Param("partNumber")String partNumber);

    List<String> selectClassIdPartNumberFix(@Param("fix") String fix, @Param("type") String type);

    List<String> selectClassIdPartNumberFix2(@Param("fix") String fix, @Param("type") String type, @Param("ibaName") String ibaName, @Param("ibaValue") String ibaValue);

    List<BigInteger> selectAllProductSpectrumByClassName(@Param("className") String className);

    /**
     * 根据零件编号列表、视图名称、类型列表和状态列表查询最新的零件信息
     *
     * @param numberList 零件编号列表，支持模糊匹配
     * @param viewName 视图名称，默认为'Design'
     * @param types 类型名称列表
     * @param stateList 状态列表
     * @return PartDO 零件信息
     */
    List<PartDO> queryPartByNumber(@Param("numberList") List<String> numberList,
                                   @Param("viewName") String viewName,
                                   @Param("types") List<String> types,
                                   @Param("stateList") List<String> stateList);


    String materialCodeCheckPatternCode(@Param("partNumber")String partNumber);

    List<String> selectRefObjBaseOid(@Param("numbers") List<String> numbers, @Param("typeName") String typeName);


    /**
     * 根据零件编号、视图名称和状态查询最新的零件信息
     * 如果编号包含*则进行模糊查询，否则进行精确查询
     *
     * @param number 零件编号，支持*通配符模糊查询
     * @param viewName 视图名称
     * @param state 生命周期状态
     * @param typeName 类型名称
     * @return PartDO 零件信息
     */
    List<PartDO> queryLatestPartByVersionAndView(
            @Param("number") String number,
            @Param("viewName") String viewName,
            @Param("state") String state,
            @Param("typeName") String typeName
    );

    /**
     * 根据零件编号、视图名称和状态查询最新的零件信息
     * 如果编号包含*则进行模糊查询，否则进行精确查询
     *
     * @param number 零件编号，支持*通配符模糊查询
     * @param viewName 视图名称
     * @param state 生命周期状态
     * @param typeName 类型名称
     * @return PartDO 零件信息
     */
    List<PartDO> queryAllVersionPartByVersionAndView(
            @Param("number") String number,
            @Param("viewName") String viewName,
            @Param("state") String state,
            @Param("typeName") String typeName
    );


}
